home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / RESCTRL.D < prev    next >
Encoding:
Modula Definition  |  1990-12-11  |  4.6 KB  |  104 lines

  1. DEFINITION MODULE ResCtrl;
  2.  
  3. FROM SYSTEM IMPORT BYTE, WORD;
  4.  
  5. FROM MOSGlobals IMPORT MemArea;
  6.  
  7. (*
  8.  * Dies Modul bietet Funktionen für Systemmodule, die Ressourcen verwalten
  9.  * und sich dazu Sys-Funktionen bedienen (und mit $Y+ übersetzt werden).
  10.  *
  11.  * Problemerläuterung:
  12.  *   Ein Systemmodul, das 'Sys'-Funktionen bietet oder globale bzw. externe
  13.  * Variablen oder Ressourcen kontrolliert (z.B. Interrupts) sollte sich selbst
  14.  * auch der Sys-Funktionen bedienen.
  15.  *   Beispielsweise kann ein Modul im Modulkörper Speicher mit SysAlloc
  16.  * anfordern oder einen Systemvektor des TOS verändern. Wird das Modul
  17.  * nicht mehr gebraucht und aus dem Speicher entfernt, muß natürlich der
  18.  * Speicher zurückgegeben bzw. der Vektor restauriert werden. Würde man
  19.  * das mit Hilfe der Funktion 'PrgCtrl.CatchProcessTerm' tun, würde es
  20.  * normalerweise funktionieren.
  21.  *  Das Problem entsteht erst, wenn das Modul, das dieses Systemmodul im-
  22.  * portiert, sich resident macht. Wenn der Prozeß dann endet, wird ja
  23.  * der vom Systemmodul geforderte 'CatchProcessTerm' aktiv und das
  24.  * Systemmodul würde seine Ressourcen schließen. Das darf es dann aber
  25.  * noch gar nicht, weil es ja noch resident bleibt und weiterhin von
  26.  * anderen Modulen benötigt wird.
  27.  *   Aus diesem Grund gibt es hier die Funktion 'CatchRemoval', die,
  28.  * entgegen 'CatchProcessTerm', das Modul erst dann informiert, wenn
  29.  * es nicht mehr benötigt, sprich importiert, wird.
  30.  *
  31.  *   Deshalb ist immer dann, wenn man daran denkt, 'CatchProcessTerm' zu
  32.  * verwenden, zu prüfen, ob nicht der oben beschriebene Fall eintreten
  33.  * kann und dann stattdessen 'CatchRemoval' einzusetzen ist.
  34.  *   Als Faustregel gilt:
  35.  *    - 'CatchRemoval' für Freigabe von Sys-Ressourcen bei Ressource-
  36.  *      verwaltenden Modulen.
  37.  *    - 'CatchProcessTerm' bei Hauptmodulen (denn hier hat das Modul
  38.  *      ja selbst die Kontrolle darüber, wann es sich resident macht
  39.  *      und wieder freigibt) und Freigabe von Ressourcen des untersten
  40.  *      Levels bei Ressource-verwaltenden Modulen (ergänzend zu den
  41.  *      "Envelopes").
  42.  *)
  43.  
  44. TYPE  RemovalCarrier = ARRAY [0..15] OF WORD;
  45.  
  46. PROCEDURE CatchRemoval ( VAR hdl: RemovalCarrier; info: PROC; wsp: MemArea );
  47.   (*
  48.    * Meldet eine Prozedur an, die aufgerufen wird, wenn das Modul,
  49.    * das die Prozedur enthält, nicht mehr benötigt wird und aus dem
  50.    * Speicher entfernt werden kann.
  51.    *
  52.    * 'wsp' ist der Stack, der 'info' beim Aufruf zugeteilt wird. 'wsp.bottom'
  53.    * darf NIL sein, dann wird der normale Programm-Stack verwendet.
  54.    *
  55.    * Diese Funktion (und nicht etwa 'CatchProcessTerm') ist deshalb
  56.    * das exakte Gegenstück zum Aufruf des Modulkörpers.
  57.    *
  58.    * Dies ist der Fall, wenn
  59.    *  a) das Modul in einem Programm eingelinkt ist und das Programm
  60.    *     normal beendet;
  61.    *  b) das Modul durch einen Import vom Loader (also durch Load-Time
  62.    *     Link) dazugeladen und gestartet wurde und nun wieder freigegeben
  63.    *     werden kann, da der Prozeß wieder endet;
  64.    *  c) das Modul von einem Modul importiert wird, das sich mit
  65.    *     'ModCtrl.InstallModule' resident gemacht hatte und nach
  66.    *     einem Aufruf von 'ReleaseModule', wie unter b), entfert wird.
  67.    *
  68.    * Wird ein Modul lediglich vom Loader (mittels 'LoadModule') geladen,
  69.    * aber nicht aufgerufen, zählt das entsprechende Ausladen des Moduls
  70.    * nicht zu den obigen Fällen. Vielmehr wird bei geladenen Modulen
  71.    * so verfahren, als wenn das Modul jedesmal neu geladen und wieder
  72.    * entladen wird.
  73.    *
  74.    * Somit ist diese Funktion dann zu verwenden, wenn ein Modul Ressourcen
  75.    * dynamisch bei seiner Initialisierung öffnet, die genau dann wieder
  76.    * geschlossen werden dürfen, wenn das Modul nicht mehr benötigt wird.
  77.    * Normalerweise könnte man das dann mit 'PrgCtrl.CatchProcessTerm'
  78.    * bewerkstelligen. Nur ist es dann nicht möglich, das Modul in Pro-
  79.    * grammen zu verwenden, die sich mit 'InstallModule' resident machen.
  80.    *
  81.    * Wird also z.B. in einem Modul im Körper Speicher angefordert, sollte
  82.    * dieser mit der Sys-Funktion (SysAlloc) angefordert werden und über
  83.    * 'CatchRemoval' der Speicher wieder freigegeben werden.
  84.    *
  85.    * WICHTIG: Das benutzende Modul muß mit der Directive "$Y+" übersetzt
  86.    *          werden!
  87.    *)
  88.  
  89. PROCEDURE Resident (): BOOLEAN;
  90.   (*
  91.    * Liefert TRUE, wenn der akt. Prozeß z.Zt. resident ist.
  92.    * Es ist zu beachten, daß dieser Zustand nicht im Modulkörper schon
  93.    * ermittelt werden soll, da das Hauptmodul, das sich evtl. resident
  94.    * macht, dies erst später durchführen kann.
  95.    *)
  96.  
  97.  
  98. PROCEDURE Private ( n: CARDINAL; VAR d: ARRAY OF BYTE );
  99.   (*
  100.    * interne Systemfunktion
  101.    *)
  102.  
  103. END ResCtrl.
  104.